/*
 * 函数 ：set_X9c104
 * num  ：滑动阶数,1010欧姆
 * ud   ：方向，1表示上滑，0表示下滑
 * save ：是否保存，1表示保存，0表示不保存
 */
int  CS_pin=3;
int  UD_pin=4;
int  INC_pin=5;
const int input = 6;
int t=0;  //t周期，f为频率，f1初始值为90，也可以设成其他合适的值，f2用来接收f1-f
float f=0;
float f1=90;
int f2=0;

int readTime()
{
  t=0;
  unsigned long t1=0; //micros()是无符号长整形，int接收会溢出；
  unsigned long t2=0;
  int initValue=digitalRead(input); //记录调用函数时电压状态
  int pinValue=initValue;
  int temp;
  int flag=0;
  //循环1000次，每次延时1ms，检测周期在1ms-1000ms之间，可以修改延时和循环次数调整检测范围
  for(int i=0;i<1000;i++)
  {
    temp=digitalRead(input);
    if(temp!=initValue && flag==0) //检测第一次电压变化的时刻记为t1，调整flag在本次调用介绍前不在进入if
    {
      t1=micros();
      
      pinValue=temp;
      flag=1;
    } 
    if(t1>0)//开始记录t1后，检测第二次电压变化时刻记为t2，跳出for循环
    {
      temp=digitalRead(input);
      if(temp!=pinValue)
      {
        t2=micros();
        break;
      }     
     }
    delay(1);
 }  
 unsigned long T= (t2-t1)/1000;
 return T; //返回毫秒数
}

void set_X9c104(int num,int ud,int save)
{

    digitalWrite(CS_pin,LOW);     //片选使能
    delayMicroseconds(10);        
    if(ud ==1)                     //滑动方向选择
    {
       digitalWrite(UD_pin,HIGH);
    }
    else
    {
      digitalWrite(UD_pin,LOW);   
    }
    delayMicroseconds(100);
    for(;num>0;num--)               //开始向设定方向移动num阶
    {
      digitalWrite(INC_pin,HIGH); 
      delayMicroseconds(100);
      digitalWrite(INC_pin,LOW);
      delayMicroseconds(100);
     //Serial.println(num);
    }
    delayMicroseconds(100);
    if (save == 1)
    {
     digitalWrite (INC_pin,HIGH);
    delayMicroseconds(100);
    }  

}

void setup() {
  pinMode (CS_pin,OUTPUT);
  pinMode (UD_pin,OUTPUT);
  pinMode (INC_pin,OUTPUT);
  pinMode(input, INPUT);
  set_X9c104(50,0,1);//初始化，将电位器调到最小。
  Serial.begin(9600);
}

void loop() {
 t=readTime();

 if(t!=0) //当流速不太快和太慢进行动作
 {
  f=1000/t;  //t是毫秒，用1000除得赫兹
  f2=(f1-f);  //f1是上一次读取流量的频率，和本次比较，大于0说明本次比上次小流速慢，调高电阻降低电压
  if(f2>0)
  {
    Serial.print("++"); 
    Serial.println(f2); 
    for(;f2>0;f2--)
    {
      set_X9c104(1,1,1);
      delay(100);
    }
    
  }else{
    Serial.print("--"); 
    Serial.println(f2); 
    f2=-f2;
    for(;f2>0;f2--)
    {
      set_X9c104(1,0,1);
      delay(100);
    }
  }
  f1=f; 
 }

 // Serial.print(t);
 // Serial.println("ms"); 
  delay(3000); 
}
